package com.wxj.bank.storage.service;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public interface IRedisService {

    /**
     * 获取键
     * @param patten
     * @return
     */
    Set<String> keys(String patten);

    /* string */

    /**
     * 存入键值
     * @param key
     * @param obj
     */
    void set(String key,Object obj);

    /**
     * 存入超时键值
     * @param key
     * @param obj
     * @param time
     * @param timeUnit
     */
    void set(String key, Object obj, long time, TimeUnit timeUnit);

    /**
     * 获取key的值
     * @param key
     * @param tClass
     * @param <T>
     * @return
     */
    <T> T get(String key,Class<T> tClass);

    /**
     * 获取n个key的值
     * @param keys
     * @param tClass
     * @param <T>
     * @return
     */
    <T> List<T> multiGet(Collection<String> keys,Class<T> tClass);

    /* list */

    /**
     * 推进多个值
     * @param key
     * @param obj
     */
    void leftPush(String key,Object... obj);

    /**
     * 获取list指定索引值
     * @param key
     * @param index
     * @param <T>
     * @return
     */
    <T> T lGet(String key,long index,Class<T> tClass);

    /**
     * 按照范围获取values
     * @param key
     * @param begin
     * @param end
     * @param tClass
     * @param <T>
     * @return
     */
    <T> List<T> lrange(String key,long begin,long end,Class<T> tClass);

    /* hash */

    /**
     * 存入map
     * @param key
     * @param hashkey
     * @param value
     */
    void put(String key,String hashkey,String value);

    /**
     * 存入集合
     * @param key
     * @param values
     */
    void putAll(String key, Map<String,String> values);

    /**
     * 获取hash存储值
     * @param key
     * @param hashkey
     * @param <T>
     * @return
     */
    <T> T getH(String key,String hashkey,Class<T> tClass);

    /**
     * 获取多个hash的值
     * @param key
     * @param keys
     * @param <T>
     * @return
     */
    <T> List<T> multiGetH(String key,Collection<String> keys,Class<T> tClass);

    /**
     * 删除hash键值
     * @param key
     * @param hashksy
     */
    void deleteH(String key,String hashksy);

    /**
     * 添加zset
     * @param key
     * @param value
     * @param score
     */
    void zadd(String key,String value,Double score);

    /**
     * 添加zset集合
     * @param key
     * @param values
     */
    void zaddCollections(String key, Map<String,Double> values);

    /**
     * 分数排序获取
     * @param key
     * @param start
     * @param end
     * @return
     */
    <T> Map<String,Double> rangeWithScore(String key,long start,long end,Class<T> tClass);

}
